package com.luzhikun.aSynchronouse_1;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

/*
 * @Author liu-miss
 * @Description Servlet的线程异步开发中的使用方式
 * @Date 17:38 2021/5/6
 * Servlet的线程异步
 *
 *      关于异步上下文对象的结束方式有三种
 *      1.在异步子线程中，用ac.complete()方法：该方法用于结束异步操作。并将与当前异步对象的request和response对象销毁
 *      2、在异步子线程中，使用ac.dispatch()方法，该方法在结束异步操作的同时，会将参数所指定的页面内容包含到当前异步对象
 *      相关的标准输出流中，其执行效果相当关于requestDispatch对象中的include()方法的执行效果
 *      3.在异步Servlet主线程中设置ac的超时时限，当超时时限到达时，异步对象及其相关的request，response对象销毁
 **/
//asyncSupported:设置当前Servlet支持异步处理
@WebServlet(name = "SynchronouseServlet", value = "/SynchronouseServlet",asyncSupported = true)
public class SynchronouseServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置字符集
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter writer = response.getWriter();

        // 开启主线程
        writer.println("主线程开始执行");
        // 获取异步上下文对象
        AsyncContext asyncContext = request.startAsync();
        // 开旗子线程
        ComputerThread ct=new ComputerThread(asyncContext);
//        Thread thread=new Thread(ct);
//        thread.start();
//        try {
//            Thread.sleep(15000);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
        // 设置异步上下文对象的超时时间为3秒
        asyncContext.setTimeout(3000);
        // 开启异步上下文对象
        asyncContext.start(ct);

        writer.println("主线程结束执行");
        writer.println("请到邮件处查看注册详情 <br>");


    }

}
